home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / LOCALMFC.PAK / LOCALCTL.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  11KB  |  423 lines

  1. // localctl.cpp : Implementation of the CLocalizeCtrl OLE control class.
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1995 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "localize.h"
  15. #include "localctl.h"
  16. #include "localppg.h"
  17.  
  18. #ifdef _WIN32
  19.   #include <winnt.h>
  20. #else
  21.   #include <olenls.h>
  22. #endif
  23.  
  24.  
  25. #ifdef _DEBUG
  26. #undef THIS_FILE
  27. static char BASED_CODE THIS_FILE[] = __FILE__;
  28. #endif
  29.  
  30.  
  31. IMPLEMENT_DYNCREATE(CLocalizeCtrl, COleControl)
  32.  
  33.  
  34. /////////////////////////////////////////////////////////////////////////////
  35. // Message map
  36.  
  37. BEGIN_MESSAGE_MAP(CLocalizeCtrl, COleControl)
  38.     //{{AFX_MSG_MAP(CLocalizeCtrl)
  39.     ON_WM_LBUTTONDOWN()
  40.     ON_WM_LBUTTONUP()
  41.     ON_WM_CANCELMODE()
  42.     //}}AFX_MSG_MAP
  43.     ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
  44. END_MESSAGE_MAP()
  45.  
  46.  
  47. /////////////////////////////////////////////////////////////////////////////
  48. // Dispatch map
  49.  
  50. BEGIN_DISPATCH_MAP(CLocalizeCtrl, COleControl)
  51.     //{{AFX_DISPATCH_MAP(CLocalizeCtrl)
  52.     DISP_PROPERTY_NOTIFY(CLocalizeCtrl, "Invert", m_invert, OnInvertChanged, VT_BOOL)
  53.     DISP_STOCKPROP_CAPTION()
  54.     //}}AFX_DISPATCH_MAP
  55.     DISP_FUNCTION_ID(CLocalizeCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
  56. END_DISPATCH_MAP()
  57.  
  58.  
  59. /////////////////////////////////////////////////////////////////////////////
  60. // Event map
  61.  
  62. BEGIN_EVENT_MAP(CLocalizeCtrl, COleControl)
  63.     //{{AFX_EVENT_MAP(CLocalizeCtrl)
  64.     EVENT_CUSTOM_ID("Click", DISPID_CLICK, FireClick, VTS_NONE)
  65.     //}}AFX_EVENT_MAP
  66. END_EVENT_MAP()
  67.  
  68.  
  69. /////////////////////////////////////////////////////////////////////////////
  70. // Property pages
  71.  
  72. // TODO: Add more property pages as needed.  Remember to increase the count!
  73. BEGIN_PROPPAGEIDS(CLocalizeCtrl, 1)
  74.     PROPPAGEID(CLocalizePropPage::guid)
  75. END_PROPPAGEIDS(CLocalizeCtrl)
  76.  
  77.  
  78. /////////////////////////////////////////////////////////////////////////////
  79. // Initialize class factory and guid
  80.  
  81. IMPLEMENT_OLECREATE_EX(CLocalizeCtrl, "LOCALIZE.LocalizeCtrl.1",
  82.     0x879d6fe0, 0x5470, 0x101b, 0xb5, 0x7b, 0x0, 0x60, 0x8c, 0xc9, 0x6a, 0xfa)
  83.  
  84.  
  85. /////////////////////////////////////////////////////////////////////////////
  86. // Type library ID and version
  87.  
  88. IMPLEMENT_OLETYPELIB(CLocalizeCtrl, _tlid, _wVerMajor, _wVerMinor)
  89.  
  90.  
  91. /////////////////////////////////////////////////////////////////////////////
  92. // Interface IDs
  93.  
  94. const IID BASED_CODE IID_DLocalize =
  95.         { 0x35e3e52, 0x6745, 0x101b, { 0xb5, 0x7b, 0x0, 0x60, 0x8c, 0xc9, 0x6a, 0xfa } };
  96. const IID BASED_CODE IID_DLocalizeEvents =
  97.         { 0x35e3e53, 0x6745, 0x101b, { 0xb5, 0x7b, 0x0, 0x60, 0x8c, 0xc9, 0x6a, 0xfa } };
  98.  
  99.  
  100. /////////////////////////////////////////////////////////////////////////////
  101. // Control type information
  102.  
  103. static const DWORD BASED_CODE _dwLocalizeOleMisc =
  104.     OLEMISC_ACTIVATEWHENVISIBLE |
  105.     OLEMISC_SETCLIENTSITEFIRST |
  106.     OLEMISC_INSIDEOUT |
  107.     OLEMISC_CANTLINKINSIDE |
  108.     OLEMISC_RECOMPOSEONRESIZE;
  109.  
  110. IMPLEMENT_OLECTLTYPE(CLocalizeCtrl, IDS_LOCALIZE, _dwLocalizeOleMisc)
  111.  
  112.  
  113. /////////////////////////////////////////////////////////////////////////////
  114. // CLocalizeCtrl::CLocalizeCtrlFactory::UpdateRegistry -
  115. // Adds or removes system registry entries for CLocalizeCtrl
  116.  
  117. BOOL CLocalizeCtrl::CLocalizeCtrlFactory::UpdateRegistry(BOOL bRegister)
  118. {
  119.     if (bRegister)
  120.         return AfxOleRegisterControlClass(
  121.             AfxGetInstanceHandle(),
  122.             m_clsid,
  123.             m_lpszProgID,
  124.             IDS_LOCALIZE,
  125.             IDB_LOCALIZE,
  126.             FALSE,                      //  Not insertable
  127.             _dwLocalizeOleMisc,
  128.             _tlid,
  129.             _wVerMajor,
  130.             _wVerMinor);
  131.     else
  132.         return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
  133. }
  134.  
  135.  
  136. /////////////////////////////////////////////////////////////////////////////
  137. // CLocalizeCtrl::CLocalizeCtrl - Constructor
  138.  
  139. CLocalizeCtrl::CLocalizeCtrl()
  140. {
  141.     InitializeIIDs(&IID_DLocalize, &IID_DLocalizeEvents);
  142.  
  143.     // Initialize inverted flag
  144.     m_inverted = FALSE;
  145. }
  146.  
  147.  
  148. /////////////////////////////////////////////////////////////////////////////
  149. // CLocalizeCtrl::~CLocalizeCtrl - Destructor
  150.  
  151. CLocalizeCtrl::~CLocalizeCtrl()
  152. {
  153. }
  154.  
  155.  
  156. /////////////////////////////////////////////////////////////////////////////
  157. // CLocalizeCtrl::OnDraw - Drawing function
  158.  
  159. void CLocalizeCtrl::OnDraw(
  160.             CDC* pdc, const CRect& rcBounds, const CRect&)
  161. {
  162.     CFont *pOldFont;
  163.     TEXTMETRIC tm;
  164.  
  165.     // Load localized caption as Caption property
  166.     const CString& strCaption = InternalGetText();
  167.  
  168.     // Draw caption
  169.     pOldFont = SelectStockFont(pdc);
  170.     pdc->SetTextAlign(TA_CENTER | TA_TOP);
  171.     GetStockTextMetrics(&tm);
  172.  
  173.     pdc->ExtTextOut((rcBounds.left + rcBounds.right) / 2, (rcBounds.top + rcBounds.bottom - tm.tmHeight) / 2,
  174.         ETO_CLIPPED | ETO_OPAQUE, rcBounds, strCaption, strCaption.GetLength(), NULL);
  175.     pdc->SelectObject(pOldFont);
  176. }
  177.  
  178.  
  179. /////////////////////////////////////////////////////////////////////////////
  180. // CLocalizeCtrl::DoPropExchange - Persistence support
  181.  
  182. void CLocalizeCtrl::DoPropExchange(CPropExchange* pPX)
  183. {
  184.     ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  185.     COleControl::DoPropExchange(pPX);
  186.  
  187.     PX_Bool(pPX, _T("Invert"), m_invert, TRUE);
  188.  
  189.     if (pPX->IsLoading())
  190.     {
  191.         CFontHolder& stockFont = InternalGetFont();
  192.         stockFont.InitializeFont();
  193.     }
  194. }
  195.  
  196.  
  197. /////////////////////////////////////////////////////////////////////////////
  198. // CLocalizeCtrl::OnResetState - Reset control to default state
  199.  
  200. void CLocalizeCtrl::OnResetState()
  201. {
  202.     COleControl::OnResetState();  // Resets defaults found in DoPropExchange
  203.  
  204.     LoadCaption();
  205. }
  206.  
  207.  
  208. /////////////////////////////////////////////////////////////////////////////
  209. // CLocalizeCtrl::AboutBox - Display a localized "About" box to the user
  210.  
  211. void CLocalizeCtrl::AboutBox()
  212. {
  213.     BOOL bError = FALSE;
  214.  
  215.     // Load resource module
  216.     HINSTANCE hResHandle = GetResourceHandle(AmbientLocaleID());
  217.  
  218.     if (!hResHandle)
  219.         bError = TRUE;
  220.  
  221.     if (!bError)
  222.     {
  223.         // Load dialog resource from resource module
  224.         HINSTANCE hResPrev = AfxGetResourceHandle();
  225.         AfxSetResourceHandle(hResHandle);
  226.  
  227.         // Execute dialog
  228.         CDialog dlgAbout(IDD_ABOUTBOX_LOCALIZE);
  229.         dlgAbout.DoModal();
  230.  
  231.         AfxSetResourceHandle(hResPrev);
  232.         FreeLibrary(hResHandle);
  233.     }
  234.     else
  235.     {
  236.         // Execute dialog, using resource in control module
  237.         CDialog dlgAbout(IDD_ABOUTBOX_LOCALIZE);
  238.         dlgAbout.DoModal();
  239.     }
  240. }
  241.  
  242.  
  243. /////////////////////////////////////////////////////////////////////////////
  244. // CLocalizeCtrl::OnInvertChanged sets the modified flag of the control
  245.  
  246. void CLocalizeCtrl::OnInvertChanged()
  247. {
  248.     SetModifiedFlag();
  249. }
  250.  
  251.  
  252. /////////////////////////////////////////////////////////////////////////////
  253. // CLocalizeCtrl::OnLButtonDown inverts the control if the Invert property
  254. // is TRUE
  255.  
  256. void CLocalizeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
  257. {
  258.     CDC* pdc;
  259.     CRect cRect;
  260.  
  261.     // If Invert property is set to TRUE
  262.     if (m_invert)
  263.     {
  264.         // Invert the control
  265.         pdc = GetDC();
  266.         GetClientRect(&cRect);
  267.         pdc->InvertRect(&cRect);
  268.         ReleaseDC(pdc);
  269.  
  270.         // Capture the mouse
  271.         SetCapture();
  272.  
  273.         // Set inverted flag
  274.         m_inverted = TRUE;
  275.     }
  276.  
  277.     COleControl::OnLButtonDown(nFlags, point);
  278. }
  279.  
  280.  
  281. /////////////////////////////////////////////////////////////////////////////
  282. // CLocalizeCtrl::OnLButtonUp fires the Click event.  First releases the
  283. // mouse capture and invalidates the control, if the control was inverted
  284. // and the mouse was captured in OnLButtonDown.
  285.  
  286. void CLocalizeCtrl::OnLButtonUp(UINT nFlags, CPoint point)
  287. {
  288.     // If inverted flag is set
  289.     if (m_inverted)
  290.     {
  291.         // Release the mouse
  292.         ReleaseCapture();
  293.  
  294.         // Invalidate to redraw (without inversion)
  295.         InvalidateControl();
  296.  
  297.         // Reset inverted flag
  298.         m_inverted = FALSE;
  299.     }
  300.  
  301.     COleControl::OnLButtonUp(nFlags, point);
  302.  
  303.     // Fire click event
  304.     FireClick();
  305. }
  306.  
  307.  
  308. /////////////////////////////////////////////////////////////////////////////
  309. // CLocalizeCtrl::OnCancelMode invalidates the control if the control was
  310. // inverted in OnLButtonDown.
  311.  
  312. void CLocalizeCtrl::OnCancelMode()
  313. {
  314.     // If inverted flag is set
  315.     if (m_inverted)
  316.     {
  317.         // Invalidate to redraw (without inversion)
  318.         InvalidateControl();
  319.  
  320.         // Reset inverted flag
  321.         m_inverted = FALSE;
  322.     }
  323.  
  324.     // Default processing will release the mouse, if captured
  325.     COleControl::OnCancelMode();
  326. }
  327.  
  328.  
  329. /////////////////////////////////////////////////////////////////////////////
  330. // CLocalizeCtrl::OnAmbientPropertyChange - Reload locale-specific caption
  331. // and invalidate if the ambient LocaleID has changed.
  332.  
  333. void CLocalizeCtrl::OnAmbientPropertyChange(DISPID dispid)
  334. {
  335.     if (dispid == DISPID_AMBIENT_LOCALEID)
  336.     {
  337.         LoadCaption();
  338.  
  339.         InvalidateControl();
  340.     }
  341. }
  342.  
  343.  
  344. /////////////////////////////////////////////////////////////////////////////
  345. // CLocalizeCtrl::LoadCaption - Load the locale-specific caption of the
  346. // control.
  347.  
  348. void CLocalizeCtrl::LoadCaption()
  349. {
  350.     CString caption;
  351.     BOOL bError = FALSE;
  352.  
  353.     // Get the handle of the resource module
  354.     HINSTANCE hResHandle = GetResourceHandle(AmbientLocaleID());
  355.  
  356.     if (!hResHandle)
  357.         bError = TRUE;
  358.  
  359.     if (!bError)
  360.     {
  361.         // Load caption from resource module
  362.         HINSTANCE hResPrev = AfxGetResourceHandle();
  363.         AfxSetResourceHandle(hResHandle);
  364.         caption.LoadString(IDS_CAPTION);
  365.         AfxSetResourceHandle(hResPrev);
  366.         FreeLibrary(hResHandle);
  367.     }
  368.     else
  369.         // Load caption from control module resource
  370.         caption.LoadString(IDS_CAPTION);
  371.  
  372.     // Set caption property
  373.     SetText(caption);
  374. }
  375.  
  376.  
  377. /////////////////////////////////////////////////////////////////////////////
  378. // CLocalizePropPage::GetResourceHandle - Load module which contains
  379. // locale-specific resources
  380.  
  381. HINSTANCE CLocalizeCtrl::GetResourceHandle(LCID lcid)
  382. {
  383.     LPCTSTR lpszResModule = NULL;
  384.     HINSTANCE hResHandle = NULL;
  385.  
  386.     // Use lcid to determine module that contains resources
  387.     LANGID langID = LANGIDFROMLCID(lcid);
  388.     unsigned short priLangID = (unsigned short) PRIMARYLANGID(langID);
  389.     switch (priLangID)
  390.     {
  391.         case LANG_ENGLISH:
  392.             break;
  393.         case LANG_FRENCH:
  394.             #ifdef _WIN32
  395.                 lpszResModule = (LPCTSTR)_T("lresfr32.dll");
  396.             #else
  397.                 lpszResModule = (LPCTSTR)_T("locresfr.dll");
  398.             #endif
  399.             break;
  400.         case LANG_GERMAN:
  401.             #ifdef _WIN32
  402.                 lpszResModule = (LPCTSTR)_T("lresde32.dll");
  403.             #else
  404.                 lpszResModule = (LPCTSTR)_T("locresde.dll");
  405.             #endif
  406.             break;
  407.         case 0:
  408.         default:
  409.              break;
  410.     }
  411.  
  412.     // Load resource module
  413.     if (lpszResModule != NULL)
  414.         hResHandle = LoadLibrary(lpszResModule);
  415.  
  416. #ifndef _WIN32
  417.     if (hResHandle <= HINSTANCE_ERROR)
  418.         hResHandle = NULL;
  419. #endif
  420.  
  421.     return hResHandle;
  422. }
  423.